<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>继承</h1>
    <ul>
        <li>使用 extends 关键字，让一个类继承已知类。</li>
        <li>被继承的已知类，称为父类（或超类），继承的类成为子类。</li>
        <li>子类继承了父类，那么它就是父类，但是父类不见得是子类（猫继承动物，猫就是动物。但动物不一定是猫）。</li>
    </ul>
    <h2>关于子类与父类的构造方法</h2>
    <ul>
        <li>如果我们显示地在子类写了构造方法，那么必须在子类构造方法第一行，显示地使用super()调用父类构造方法。</li>
    </ul>
    <h2>多态</h2>
    <ul>
        <li>子类继承了父类，自动有父类的行为（方法）。</li>
        <li>但是对于同一种行为，子类可以有不同的实现（表现状态）。</li>
        <li>子类定与父类相同名字的方法，称为方法重写（Override）。</li>
        <li>子类重写了父类的方法之后，父类方法被覆盖，子类中可以使用 super.父类方法() 来访问父类的方法。</li>
    </ul>
    <script>
        class Animal {

            constructor(species) {
                this.species = species;
            }

            sleep() {
                console.log(this.species + "正在睡觉。");
            }

            eat() {
                console.log(this.species + ",直接开始。");
            }

        }

        class Cat extends Animal {
            constructor(species) {
                super(species)
            }
        }

        let cat1 = new Cat("猫");
        
        cat1.sleep();
        cat1.eat();

        class Human extends Animal {
            constructor(species,name) {
                super(species);
                this.name = name;
            }

            eat() {
                console.log(this.species,this.name ,"把食物煮熟了，再始。"); 
            }

            sleep() {
                super.sleep();
                console.log("请不要打扰：",this.name);
            }
        }

        let yhz = new Human("人类","袁浩哲");
        yhz.sleep();
        yhz.eat();

    </script>
</body>
</html>